//
// Created by shengym on 2019-07-15.
//
#include "lib/common.h"

int main(int argc, char **argv)
{
    if (argc != 2) 
    {
        error(1, 0, "usage: unixstreamclient <local_path>");
    }

    int sockfd;
    struct sockaddr_un servaddr;

    // 创建了一个本地套接字，和前面服务器端程序一样，用的也是字节流类型 SOCK_STREAM
    sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
    if (sockfd < 0) 
    {
        error(1, errno, "create socket failed");
    }

    // 初始化目标服务器端的地址。我们知道在 TCP 编程中，使用的是服务器的 IP 地址和端口作为目标，
    // 在本地套接字中则使用文件路径作为目标标识，sun_path 这个字段标识的是目标文件路径，
    // 所以这里需要对 sun_path 进行初始化
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sun_family = AF_LOCAL;
    strcpy(servaddr.sun_path, argv[1]);

    // 和 TCP 客户端一样，发起对目标套接字的 connect 调用，不过由于是本地套接字，并不会有三次握手
    if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 
    {
        error(1, errno, "connect failed");
    }

    char send_line[MAXLINE];
    bzero(send_line, MAXLINE);
    char recv_line[MAXLINE];

    // 从标准输入中读取字符串，向服务器端发送，之后将服务器端传输过来的字符打印到标准输出上
    while (fgets(send_line, MAXLINE, stdin) != NULL) 
    {
        int nbytes = sizeof(send_line);
        if (write(sockfd, send_line, nbytes) != nbytes)
            error(1, errno, "write error");

        if (read(sockfd, recv_line, MAXLINE) == 0)
            error(1, errno, "server terminated prematurely");

        fputs(recv_line, stdout);
    }

    exit(0);
}